package conf

import (
	"encoding/json"
	"os"
	"svr/src/logs"
	"svr/src/msg"
)

var ServerConfig struct {
	//db_info文件路径，包含.cfg则解密后使用
	// DBConfPath string

	//log
	// LogLevel  string
	// LogPath   string
	// LogPathTa string

	//msg
	MsgReadBuf  int
	MsgWriteBuf int
	// MaxMsgLen       uint32
	// PendingWriteNum int
	// MaxConnNum      int

	//websocket
	ListenPort int32
	// WSAddr string
	// CertFile string
	// KeyFile  string
	ServerType        msg.DeviceType     //网关1，全服2，数据服3，单服10，客户端11，gm端12，逻辑13，转发14，战斗15
	TopServerAddr     string             //顶级服务器地址，负责维护所有其他服务器的监听端口
	ConnetServerTypes [][]msg.DeviceType //二维数组，每个数组第0位是上级serverType，后面是他的下级serverType
	Balance           msg.BalanceType    //0无需负载，1需要上传负载，2需要分配负载

	//Tcp
	// TCPAddr        string
	// LenMsgLen      int
	// LittleEndian   bool
	// TCPAddrOutside string

	// TCPAddrTest  string
	//Kcp
	// KCPAddr string
	// KCPMode int

	// ConsoleIp   string
	// ConsolePort int
	// ProfilePath string

	//server逻辑相关
	// MaxServerID int32
	// ServerId    int32
	// //重复登录的处理模式，0踢掉之前的，1提示重复登录
	// RepeateLoginMode int32

	// Type        int32
	// GlobalAddr  string
	// SubServerId string
}

var configPath = "../cfg/"

func init() {
	if logs.IsSrcDir() {
		configPath = "../" + configPath
	}
}

var MapConnetServerTypeUp map[msg.DeviceType][]msg.DeviceType
var MapConnetServerTypeDown map[msg.DeviceType][]msg.DeviceType

func LoadConfigFile(jsFileName string) error {
	jsPath := configPath + jsFileName
	data, err := os.ReadFile(jsPath)
	if err != nil {
		data, err = os.ReadFile(jsPath)
		if err != nil {
			logs.Fatal("%v", err)
			return err
		}
	}
	err = json.Unmarshal(data, &ServerConfig)
	if err != nil {
		logs.Fatal("%v", err)
		return err
	}
	if IsTopServer() {
		MapConnetServerTypeUp = make(map[msg.DeviceType][]msg.DeviceType)
		MapConnetServerTypeDown = make(map[msg.DeviceType][]msg.DeviceType)
		for _, vals := range ServerConfig.ConnetServerTypes {
			var typ msg.DeviceType
			for i, val := range vals {
				if i == 0 {
					typ = val
				} else {
					MapConnetServerTypeDown[typ] = append(MapConnetServerTypeDown[typ], val)
					MapConnetServerTypeUp[val] = append(MapConnetServerTypeUp[val], typ)
				}
			}
		}
	}
	logs.Debugf("ServerConfig------:%+v", ServerConfig)
	// logs.Debugf("**************ConnetServerTypes 1 ****************", MapConnetServerTypeDown)
	// logs.Debugf("**************ConnetServerTypes 2 ****************", MapConnetServerTypeUp)
	return err
}

func IsTopServer() bool {
	return ServerConfig.TopServerAddr == ""
}
